package shg.book.control
{
	import flash.display.NativeWindowSystemChrome;
	import flash.filesystem.File;
	import flash.filesystem.FileMode;
	import flash.filesystem.FileStream;
	import flash.utils.ByteArray;
	
	import mx.collections.ArrayCollection;
	
	import shg.book.util.MD5;

	public class ReadHtmlFile
	{
		//密钥字符串
		private var KDC:String="";
		private var validata:String;
		private var htmlArray:ArrayCollection;
		private var imgByteArray:ArrayCollection;
		private var imgSize:ArrayCollection;
		private var imgIDArray:ArrayCollection;
		//图片的存储目录
		private var img_path:String;
		private var textFlow_label:XML;
		private var newxml:XML;
		
		public function ReadHtmlFile()
		{
		}
		public function readByte(byte:ByteArray):void{
			byte.position=byte.length-(10*10);
			//原来存储最后那100个固定的字符串，然后就对这100个字符串进行分析
			var last100:String=byte.readMultiByte(100,"UTF-8");
			//收费还是免费
			var changeOrFree:int=Number(last100.slice(41,50));
			//加密内容长度
			var KDCLength:int=Number(last100.slice(81,90));
			var HTMLLength:int=Number(last100.slice(71,80));
			var imgID:int=Number(last100.slice(61,70));
			var img_size_index:int=Number(last100.slice(51,60));
			//样子内容是否被改变
			byte.position=byte.length-KDCLength;
			var validatestr:String=byte.readMultiByte(KDCLength,"UTF-8");
			var _str:String=validatestr.substring(0,KDCLength-(10*6))+"0000000000"+validatestr.substring(KDCLength-(10*5),validatestr.length);
			var page_html_size:String=validatestr.substring(validatestr.length-(10*10+HTMLLength),validatestr.length-10*10);
			var array:Array=page_html_size.split("&");
			var all_html_size:Number=0;
			for(var a:int=0;a<array.length;a++){
				all_html_size+=Number(array[a]);
			}
			byte.position=byte.length-(changeOrFree+all_html_size+img_size_index+imgID+HTMLLength+(10*10));
			var fileKDC:String=byte.readMultiByte(changeOrFree,"UTF-8");
			if(changeOrFree==32){
				validata=freeBook(_str);
				if(fileKDC==validata){
					readFileDate(array,byte,img_size_index,imgID);
				}else{
					trace("文件书籍被修改");
				}
			}else if(changeOrFree==64){
				validata=changeBook(_str);
				if(fileKDC.slice(0,31)==validata.slice(0,31)){
					if(fileKDC.slice(32,63)==validata.slice(32,36)){
						readFileDate(array,byte,img_size_index,imgID);
					}else{
						trace("对不起！你没有购买此书！如果有疑问请联系我们");
					}
				}else{
					trace("文件书籍被修改");
				}
			}else{
				trace("文本内容发送改变");
			}
		}
		/**
		 * 收费解密方法
		 * 
		 * */
		private function changeBook(_str:String):String{
			var md5:MD5=new MD5();
			//第二次解密（KDC就是第一次加密）
			var KDC_two:String=md5.getMD5(_str);
			//第三次解密
			var KDC_three:String=md5.getMD5(_str+KDC_two);
			//第四解密,联网之后就需要到网上获取这个序列号！
			var KDC_four:String=md5.getMD5(KDC_three+KDC);
			//返回解密信息，其中KDC_three是验证当前这本书籍是否被更改，KDC_four验证当前这本书籍是购买
			return KDC_three+KDC_four;
		}
		/**
		 * 免费解密方法
		 * 
		 * */
		private function freeBook(_str:String):String{
			var md5:MD5=new MD5();
			//第一次解密
			var KDC_one:String=md5.getMD5(_str);
			//第二次解密
			var KDC_two:String=md5.getMD5(_str+KDC_one);
			//返回解密信息
			return KDC_two;
		}
		/**
		 * 如果所有的数据信息都已经成功的验证最后就
		 * 开始读取文件里面的所有数据，为生成页面做好准备
		 * */
		private function readFileDate(array:Array,byte:ByteArray,img_size_index:int,imgID:int):void{
			//在读取文件之前我们需要创建文件目录，将读取到的文件图片写入指定的目录里面，创建文件夹，原来临时保存图片文件，当应用程序加载完成最后就删除此文件夹
			var bookImgPath:File=File.applicationStorageDirectory.resolvePath("Book ImgPath");
			//如果已经存在这个文件夹就首先把他删除
			if(bookImgPath.exists)
				bookImgPath.deleteDirectory(true);
			//创建新的文件夹
			bookImgPath.createDirectory();
			img_path=bookImgPath.nativePath;
			if(htmlArray==null)
				htmlArray=new ArrayCollection();
			//HTML字节数组
			for(var k:int=0;k<array.length;k++){
				var html:String=byte.readMultiByte(Number(array[k]),"UTF-8");
				var xml:XML=updateSource(html);
				var textFlow:XML=textFlow_label.appendChild(xml.children());
				htmlArray.addItem(textFlow);
			}
			
			var imgStr:String=byte.readMultiByte(img_size_index,"UTF-8");
			var imgArray:Array=imgStr.split("&");
			//图片大小的字节数组
			for(var g:int=0;g<imgArray.length;g++){
				if(imgSize==null)
					imgSize=new ArrayCollection();
				if(g<4){//前四位是封面图片
					imgSize.addItem(imgArray[g]);
				}else{
					var _str:String=String(imgArray[g]).split("-")[0];
					imgSize.addItem(_str);
				}
			}
			//图片ID字节数组
			var ID:String=byte.readMultiByte(imgID,"UTF-8");
			imgIDArray=new ArrayCollection(ID.split("&"));
			
			//最后读取的是图片数据信息
			byte.position=0;
			if(imgByteArray==null)
				imgByteArray=new ArrayCollection();
			for(var m:int=0,n:int=0;m<imgSize.length;m++){
				if(imgSize[m]>0){
					var imgByte:ByteArray=new ByteArray();
					byte.readBytes(imgByte,0,Number(imgSize[m]));
					if(m<4){//这里只需要把前面四张存储在数组里面就可以了，
						imgByteArray.addItem(imgByte);
					}else{
						var name:String=String(imgIDArray[n]);
						createImage(name,imgByte,img_path);
						n++;
					}
				}
			}
		}
		/**
		 * 创建图片的，把图片写出来
		 * 
		 * */
		private function createImage(imgName:String,imgByte:ByteArray,img_path:String):void{
			var file:File=new File(img_path+"\\"+imgName+".png");
			var stream:FileStream=new FileStream();
			stream.open(file,FileMode.WRITE);
			stream.writeBytes(imgByte);
			stream.close();
		}
		/**
		 * 当作者是保存的话就需要清空编辑器并将数据保存到数组里面
		 * */
		private   function updateSource(html:String):XML{
			//总长度
			var length:Number=html.length;
			//下面的目的只有一个就是把 <TextFlow></TextFlow>标签删除，因为它带有命名空间，下面采用的E4X无法操作这个带命名空间的XML
			var first:Number=html.indexOf(">",0);
			var last:Number=html.lastIndexOf("<",length);
			var list:XMLList=new XMLList(html.slice(first+1,length-(length-last)));
			//把textFlow保存在一个临时变量
			textFlow_label=new XML(html.slice(0,first+1)+html.slice(last,length));
			
			newxml=new XML(<order></order>);
			newxml.appendChild(list);
			
			return findSource(newxml.children());
		}
		//通过imf的ID寻找其值
		private function findSource(list:XMLList):XML{
			var imgLength:Number=list.img.length();
			//先判断其是否存在子节点,如果存在子节点当前节点是否存在img
			if(list.length()>0){
				if(imgLength>0){
					for(var i:Number=0;i<imgLength;i++){
						list.img[i].@source=img_path+"\\"+list.img[i].@id+".png";
					}
				}
			}
			//如果还存在子节点就递归调用
			if(list.children().length()>0){
				findSource(list.children());
			}
			return newxml;
		}
	}
}